package com.yuntsg.nnsfcp.test.bosspdfparsetest;

import cn.hutool.core.util.NumberUtil;
import cn.hutool.core.util.ReUtil;
import cn.hutool.db.Db;
import cn.hutool.db.Entity;
import cn.hutool.json.JSONUtil;
import com.yuntsg.nnsfcp.entity.BiaoshuEntity;
import lombok.SneakyThrows;

import java.io.File;
import java.sql.SQLException;
import java.util.*;
import java.util.regex.Pattern;

public class PDFParseV2 {
    /**
     * 国自然标书拆分程序，本程序只可以拆分《版本：17010000003013679》，其它版本的应再作适配。
     * 葛成瑞 2024年9月29日15:08:06
     */


    @SneakyThrows
    public static void main(String[] args) {

        String filePath = "D:\\Users\\55419\\Documents\\Tencent Files\\554197753\\FileRecv\\2017_面上项目_MicroRNA 30b通过调节自噬参与慢性肾脏病血管钙化的机制研究.pdf";
        File file = new File(filePath);
        List<En.TableText> tableTextList = Util.dellPageInfo(file);
        String fundTable = "fundTable";
        Db use = Db.use();
        BiaoshuEntity biaoshuEntity = new BiaoshuEntity();
        extractFiled17010000003013679(tableTextList, fundTable, use, biaoshuEntity);

    }

    //改造成我需要的
    public static void extractFiled17010000003013679(List<En.TableText> l, String fundTable, Db use, BiaoshuEntity biaoshuEntity) throws SQLException {
        if (use != null) {
            use.execute("truncate table " + fundTable);  // 截断表
        }
        Set<String> fieldSet = Util.getField17010000003013679();
        En.Cover cover = new En.Cover();
        En.Applicant applicant = new En.Applicant();
        En.HostInstitution hostInstitution = new En.HostInstitution();
        En.Project project = new En.Project();
        En.Total total = new En.Total();
        List<En.Budget> budgetList = new ArrayList<>();
        List<En.PrincipalInvestigator> principalInvestigatorList = new ArrayList<>();
        boolean isApplicant = false;
        boolean isHostInstitution = false;
        boolean isProject = false;
        //总人数
        boolean isTotal = false;
        boolean isBudget = false;
        boolean isBudgetJustification = false;
        // 是不是主要参数者
        boolean isPrincipalInvestigator = false;
        // 是不是报告正文
        boolean isReportText = false;
        boolean isProjectBasis = false;
        boolean isResume = false;
        boolean isAnnex = false;
        boolean isInstructions = false;
        List<String> referenceList = new ArrayList<>();
        Set<String> labelSet = new HashSet<>();
        Map<String, String> labelAndInfoMap = new LinkedHashMap<>();
        List<En.Resume> resumeList = new ArrayList<>();
        List<En.Annex> annexList = new ArrayList<>();

//        for (En.TableText tableText : l) {
//            System.out.println(tableText.getText());
//        }
//        for (int i = 0; i < l.size(); i++) {
//            if (l.get(i).getText().equals("总人数")) {
//                System.out.println(l.get(i).getText());
//                System.out.println("iii+"+i);
//            }
//        }

        for (int i = 0; i < l.size(); i++) {
            En.TableText tableText = l.get(i);
            String t = tableText.getText();
            System.out.println("+++ ii++" + i + "@@@@" + t + "++++");
            isApplicant = "申".equals(t) && l.size() > (i + 4) && "请".equals(l.get(i + 1).getText()) && "人".equals(l.get(i + 2).getText()) && "信".equals(l.get(i + 3).getText()) && "息".equals(l.get(i + 4).getText()) || isApplicant;
            isHostInstitution = "依".equals(t) && l.size() > (i + 5) && "托".equals(l.get(i + 1).getText()) && "单".equals(l.get(i + 2).getText()) && "位".equals(l.get(i + 3).getText()) && "信".equals(l.get(i + 4).getText()) && "息".equals(l.get(i + 5).getText()) || isHostInstitution;
            // 下面的语句等效于：isApplicant = isHostInstitution ? false : isApplicant; 意思是isHostInstitution为true，则isApplicant为false，否则保持不变。下面还有三个类似的，是同一个意思。
            isApplicant = !isHostInstitution && isApplicant;
            isProject = "项".equals(t) && l.size() > (i + 5) && "目".equals(l.get(i + 1).getText()) && "基".equals(l.get(i + 2).getText()) && "本".equals(l.get(i + 3).getText()) && "信".equals(l.get(i + 4).getText()) && "息".equals(l.get(i + 5).getText()) || isProject;
            isHostInstitution = !isProject && isHostInstitution;
            isPrincipalInvestigator = "编号".equals(t) && l.size() > (i + 9) && "姓名".equals(l.get(i + 1).getText()) && "出生年月".equals(l.get(i + 2).getText()) && "性别".equals(l.get(i + 3).getText()) && "职 称".equals(l.get(i + 4).getText()) && "学 位".equals(l.get(i + 5).getText()) &&
                    "单位名称".equals(l.get(i + 6).getText()) && "电话".equals(l.get(i + 7).getText()) && "电子邮箱".equals(l.get(i + 8).getText()) && "证件号码".equals(l.get(i + 9).getText()) || isPrincipalInvestigator;
            isProject = !isPrincipalInvestigator && isProject;
            isTotal = "总人数".equals(t) && "高级".equals(l.get(i + 1).getText()) && "中级".equals(l.get(i + 2).getText()) && "初级".equals(l.get(i + 3).getText()) && "博士后".equals(l.get(i + 4).getText()) &&
                    "博士生".equals(l.get(i + 5).getText()) && "硕士生".equals(l.get(i + 6).getText()) || isTotal;
            isBudget = "序号".equals(t) && l.size() > (i + 2) && "科目名称".equals(l.get(i + 1).getText()) && "金额".equals(l.get(i + 2).getText()) && "备注".equals(l.get(i + 3).getText()) || isBudget;
            isBudgetJustification = "单位资质及资金外拨情况、自筹资金进行必要说明。".equals(t) && l.size() > (i + 1) && "）".equals(l.get(i + 1).getText()) || isBudgetJustification;
            isProjectBasis = "展中迫切需要解决的关键科技问题来论述其应用前景。附主要参考文".equals(t) && l.size() > (i + 1) && "献目录）；".equals(l.get(i + 1).getText()) || isProjectBasis;

            if (fieldSet.contains(t) && tableText.getPage() == 1 && l.size() > i + 1) {
                String nextText = l.get(i + 1).getText();
                if ("申请代码".equals(t)) {
                    cover.setApplicationCode(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("受理部门".equals(t)) {
                    cover.setReceivingDepartment(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("收件日期".equals(t)) {
                    cover.setReceiptDate(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("受理编号".equals(t)) {
                    cover.setReceivingNumber(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("资助类别：".equals(t)) {
                    cover.setTypesOfFunding(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("亚类说明：".equals(t)) {
                    cover.setSubclassSpecification(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("申报日期：".equals(t)) {
                    cover.setApplicationDate(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("附注说明：".equals(t)) {
                    cover.setExplanatoryNote(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("项目名称：".equals(t) && l.size() > i + 2) {
                    String endText = l.get(i + 2).getText();
                    if (fieldSet.contains(nextText)) {
                        cover.setProjectName("");
                    } else {
                        if (fieldSet.contains(endText)) {
                            cover.setProjectName(nextText);
                        } else {
                            cover.setProjectName(nextText + endText);
//                            i = i + 1;
                        }
                    }
                }
                if ("申 请 人：".equals(t)) {
                    cover.setApplicant(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("BRID：".equals(t)) {
                    cover.setBrid(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("办公电话：".equals(t)) {
                    cover.setOfficeTelephone(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("依托单位：".equals(t)) {
                    cover.setSupportingUnit(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("通讯地址：".equals(t)) {
                    cover.setMailingAddress(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("邮政编码：".equals(t)) {
                    cover.setPostalCode(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("单位电话：".equals(t)) {
                    cover.setWorkTelephone(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("电 话：".equals(t)) {
                    cover.setApplicantphone(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("电子邮箱：".equals(t)) {
                    cover.setEmailAddress(fieldSet.contains(nextText) ? "" : nextText);
                }
            } else if (isApplicant && l.size() > i + 5) {
                String nextText = l.get(i + 1).getText();
                if ("姓        名".equals(t)) {
                    applicant.setFullName(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("性别".equals(t)) {
                    applicant.setGender(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("出生".equals(t) && l.size() > i + 2 && "年月".equals(l.get(i + 1).getText())) {
                    applicant.setDateOfBirth(fieldSet.contains(l.get(i + 2).getText()) ? "" : l.get(i + 2).getText());
                }
                if ("民族".equals(t)) {
                    applicant.setNation(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("学        位".equals(t)) {
                    applicant.setAcademicDegree(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("职称".equals(t)) {
                    applicant.setTitle(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("是否在站博士后".equals(t)) {
                    applicant.setPostdoctoralResearcher(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("电子邮箱".equals(t)) {
                    applicant.setEmailAddress(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("办公电话".equals(t)) {
                    applicant.setOfficeTelephone(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("国别或地区".equals(t)) {
                    applicant.setCountryOrArea(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("申请人类别".equals(t)) {
                    applicant.setApplyForHumanCategory(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("工   作   单   位".equals(t)) {
                    applicant.setWorkUnit(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("个 人 通 讯 地 址".equals(t)) {
                    applicant.setPersonalMailingAddress(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("主 要 研 究 领 域".equals(t)) {
                    applicant.setMainResearchAreas(fieldSet.contains(nextText) ? "" : nextText.length() > 2 ? nextText : "");
                }
            } else if (isHostInstitution && l.size() > i + 1) {
                String nextText = l.get(i + 1).getText();
                if ("名        称".equals(t)) {
                    hostInstitution.setName(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("联   系   人".equals(t)) {
                    hostInstitution.setContacts(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("电子邮箱".equals(t)) {
                    hostInstitution.setEmailAddress(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("电        话".equals(t)) {
                    hostInstitution.setOfficeTelephone(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("网站地址".equals(t)) {
                    hostInstitution.setWebsiteAddress(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("单 位 名 称".equals(t)) {
                    hostInstitution.setUnitName(fieldSet.contains(nextText) ? "" : nextText.length() > 2 ? nextText : "");
                }
            } else if (isProject && l.size() > i + 1) {
                String nextText = l.get(i + 1).getText();
                if ("项目名称".equals(t)) {
                    project.setProjectName(Util.forGetField(l, i, false, 1, "英文名称"));
                }
                if ("英文名称".equals(t)) {
                    project.setEnglishName(Util.forGetField(l, i, false, 1, "资助类别"));
                }
                if ("资助类别".equals(t)) {
                    project.setTypesOfFunding(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("亚类说明".equals(t)) {
                    project.setSubclassSpecification(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("附注说明".equals(t)) {
                    project.setExplanatoryNote(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("申请代码".equals(t)) {
                    project.setApplicationCode(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("研究期限".equals(t)) {
                    project.setResearchPeriod(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("研究方向：".equals(t)) {
                    project.setResearchDirection(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("申请直接费用".equals(t)) {
                    project.setDirectCosts(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("研究属性".equals(t)) {
                    project.setResearchAttributes(fieldSet.contains(nextText) ? "" : nextText);
                }
                if ("中 文 关 键 词".equals(t)) {
                    project.setChineseKeywords(Util.forGetField(l, i, false, 1, "英 文 关 键 词"));
                }
                if ("英 文 关 键 词".equals(t)) {
                    StringBuilder s = new StringBuilder();
                    for (int j = i + 1; j < l.size(); j++) {
                        String n = l.get(j).getText();
                        // NSFC 20
                        if ("NSFC 20".equals(n) && l.size() > j + 3 && "17".equals(l.get(j + 1).getText()) && "第 1 页".equals(l.get(j + 2).getText())) {
                            break;
                        } else {
                            s.append(n);
                        }
                    }
                    project.setEnglishKeywords(s.toString().trim());
                }
                if ("中".equals(t) && l.size() > i + 3 && "文".equals(l.get(i + 1).getText()) && "摘".equals(l.get(i + 2).getText()) && "要".equals(l.get(i + 3).getText())) {
                    StringBuilder s = new StringBuilder();
                    for (int j = i + 4; j < l.size(); j++) {
                        String n = l.get(j).getText();
                        if ("英".equals(n) && l.size() > j + 3 && "文".equals(l.get(j + 1).getText()) && "摘".equals(l.get(j + 2).getText()) && "要".equals(l.get(j + 3).getText())) {
                            break;
                        } else {
                            if (n.endsWith(".") || n.endsWith(". ") || n.endsWith("。") || n.endsWith("。 ")) {
                                s.append(n).append(System.lineSeparator());
                            } else {
                                s.append(n);
                            }
                        }
                    }
                    project.setChineseAbstract(s.toString().trim());
                }
                if ("英".equals(t) && l.size() > i + 3 && "文".equals(l.get(i + 1).getText()) && "摘".equals(l.get(i + 2).getText()) && "要".equals(l.get(i + 3).getText())) {
                    project.setEnglishAbstract(Util.forGetField(l, i, true, 4, "NSFC 20").trim());
                }
            } else if (isPrincipalInvestigator && l.size() > i + 10) {
                // 最多认为有99行，即最多循环99次。
                for (int j = 0; j < 100; j++) {
                    String n = l.get(i).getText();
                    float left = l.get(i).getLeft();
                    if ("总人数".equals(n)) {
                        isPrincipalInvestigator = false;
                        break;
                    }
                    // 首次进来，下面的条件肯定是符合的（因为，主要参与者是不为空的，但如果是空，下面的条件不符合，也不会陷入死循环），符合条件说明第一个是编号，则继续往下走，再次遇到编号或"总人数统计"时退出。因主要参与者内共有10个字段，完全不知道可能会缺少哪个字段，故使用左坐标的形式来定位属于哪个字段（因为对象是一个表格）。
                    if (left > 70 && left < 100 && NumberUtil.isInteger(n.trim()) && n.length() < 3) {
                        Map<Float, String> leftAndValueMap = new LinkedHashMap<>();
                        leftAndValueMap.put(left, n);
                        for (int m = i + 1; m < l.size(); m++) {
                            String endText = l.get(m).getText();
                            String endTextNext = "";
                            try {
                                endTextNext = l.get(m + 1).getText();
                            } catch (Exception e) {

                            }
                            float endLeft = l.get(m).getLeft();
                            // 部分邮箱拆分不正确 需要校验
                            if (endText.contains("@") && !ReUtil.isMatch("^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\\.[a-zA-Z]{2,}$", endText)) {
                                endText = endText + endTextNext;
                                m++;
                            }
                            if ((endLeft > 70 && endLeft < 100 && NumberUtil.isInteger(endText) && endText.length() < 3) || "总人数".equals(endText)) {
//                                i = m;
                                break;
                            } else if (!endText.replace(" ", "").trim().isEmpty()) {
                                leftAndValueMap.put(endLeft, endText);
                            }
                        }
                        En.PrincipalInvestigator principalInvestigator = new En.PrincipalInvestigator();
                        for (Map.Entry<Float, String> entry : leftAndValueMap.entrySet()) {
                            Float mLeft = entry.getKey();
                            String mText = entry.getValue();

                            if (mLeft > 70 && mLeft < 95 && NumberUtil.isInteger(mText) && mText.length() < 3) {
                                principalInvestigator.setNumber(mText);
                            }
                            if (mLeft > 95 && mLeft < 160) {
                                principalInvestigator.setFullName(mText);
                            }
                            if (mLeft > 169 && mLeft < 230) {
                                principalInvestigator.setDateOfBirth(mText);
                            }
                            if (mLeft > 245 && mLeft < 250) {
                                principalInvestigator.setGender(mText);
                            }
                            if (mLeft > 269 && mLeft < 320) {
                                principalInvestigator.setTitle(mText);
                            }
                            if (mLeft > 337 && mLeft < 360) {
                                principalInvestigator.setAcademicDegree(mText);
                            }
                            if (mLeft > 369 && mLeft < 450) {
                                principalInvestigator.setWorkUnit(mText);
                            }

                            if (mLeft > 470 && mLeft < 520) {
                                principalInvestigator.setOfficeTelephone(mText);
                            }
                            if (mLeft > 520 && mLeft < 619) {
                                principalInvestigator.setEmail(mText);
                            }
                            if (mLeft > 620 && mLeft < 740) {
                                principalInvestigator.setIdentificationNumber(mText);
                            }
                            if (mLeft > 747) {
                                principalInvestigator.setPerYearTime(mText);
                            }
                        }
                        principalInvestigatorList.add(principalInvestigator);
                    }

                }
            } else if (isTotal && l.size() > i + 6) {
                // 为什么加9？因为需要把那9行的都过滤掉。
                //   17010000003013679 版本解析有问题 没有总人数 这里
                // 2024年10月6日15:27:36 是因为下面部分操作进行i-- 或者i++ 导致的
                for (int j = i + 6; j < l.size(); j++) {
                    String n = l.get(j).getText();
                    float left = l.get(j).getLeft();
                    if ("NSFC 20".equals(n)) {
                        isTotal = false;
                        break;
                    } else {
                        if (left > 128 && left < 230) {
                            total.setTotalPersonnelCount(n);
                        }
                        if (left > 240 && left < 300) {
                            total.setSeniorPositions(n);
                        }
                        if (left > 331 && left < 350) {
                            total.setIntermediatePositions(n);
                        }
                        if (left > 351 && left < 410) {
                            total.setJuniorPositions(n);
                        }
                        if (left > 411 && left < 590) {
                            total.setPostdoc(n);
                        }
                        if (left > 600 && left < 699) {
                            total.setPhdStudent(n);
                        }
                        if (left > 700 && left < 750) {
                            total.setMasterStudent(n);
                        }
//                        if (left > 608 && left < 735) {
//                            total.setUndergraduate(n);
//                        }
//                        if (left > 734) {
//                            total.setOthers(n);
//                        }
                    }
                }
            } else if (isBudget && l.size() > i + 3) {
                //  这里不行需要进行适配进进解析
                for (int j = 0; j < 100; j++) {
                    String n = l.get(i).getText();
                    float left = l.get(i).getLeft();
                    if ("二、 自筹资金来源".equals(l.get(i - 3).getText())) {
                        isInstructions = true;
                        isBudget = false;
                        break;
                    }

                    if (left > 63 && left < 120 && NumberUtil.isInteger(n) && n.length() < 3 && l.size() > i + 3) {
                        En.Budget budget = new En.Budget();
                        budget.setSerialNumber(n);
                        budget.setSubjectName(l.get(i + 1).getText());
                        budget.setAmountOfMoney(l.get(i + 2).getText());
                        budgetList.add(budget);
                        i = i + 3;
                    }
                }
            } else if ("报告正文 ".equals(t)) {
                isReportText = true;
            } else if (isInstructions) {
                i = Util.getReportText(i, l, labelSet, "预算说明书", "究外拨资金、单价≥10万元的设备费等内容进行详细说明，可根据需要另加附页。） ", "预算说明书", "NSFC 20", "", "", 2, labelAndInfoMap) - 1;
                System.out.println("预算说明书结束++I+++" + i);
                System.out.println("结束后i的值++I+++" + l.get(i).getText());
                isInstructions = false;
                // 2024年10月6日17:10:34 处理到这里了明天继续
//                i = Util.getReportText(i, l, labelSet, "预算说明书", "单位资质及资金外拨情况、自筹资金进行必要说明。", "（一）立项依据与研究内容", "报告正文", "", "", 3, labelAndInfoMap) - 1;
            } else if (isReportText) {
                if ("2024版".equals(t) || (i - 1 > 0 && "2024版".equals(l.get(i - 1).getText()))) {
                    isReportText = false;
                    isResume = true;
//                    i = i - 2;
                }
                i = Util.getReportText(i, l, labelSet, "报告正文 ", "考文献目录）； ", "（一）参考文献", "参考文献", "", "", 0, labelAndInfoMap);
                System.out.println("正文结束结束++I+++" + i);
                System.out.println("正文结束结束++I+++" + l.get(i).getText());
//                if (labelSet.contains("（一）参考文献")) {
//                    StringBuilder s = new StringBuilder();
//                    for (int j = i + 1; j < l.size(); j++) {
//                        String first = l.get(j).getText();
//                        String middle = (l.size() > j + 1) ? l.get(j + 1).getText() : "";
//                        String end = (l.size() > j + 2) ? l.get(j + 2).getText() : "";
//                        if ("2".equals(first) && "．项目的研究内容、研究目标，以及拟解决的关键科学问题（此".equals(middle) && "部分为重点阐述内容）；".equals(end)) {
//                            labelSet.remove("（一）参考文献");
//                            labelSet.add("1.2项目的研究内容");
//                            i = j;
//                            break;
//                        } else {
//                            String reference = l.get(j).getText();
//                            if (Pattern.compile("^\\[[0-9]{0,3}] ").matcher(reference).find() && s.toString().trim().length() > 3) {
//                                referenceList.add(s.toString().trim());
//                                s = new StringBuilder();
//                            }
//                            s.append(reference);
//                        }
//                    }
//                    if (s.toString().trim().length() > 3) {
//                        referenceList.add(s.toString().trim());
//                    }
//                }
                // 参数：labelSet:标签集合，currentLabel:当前的本次处理后应移除的标签，start:当前的标签出现指定的字符串后开始工作，netLabel:下一个标签，first:本次的标签结束，下一个标签的触发条件，即出现的第一行字符串的值，middle:第二行的值，end:第三行的值。number:本次的内容去掉不需要的行数，labelAndInfoMap:当前的标签及获取的内容保存。
                i = Util.getReportText(i, l, labelSet, "1.2项目的研究内容", "．项目的研究内容、研究目标，以及拟解决的关键科学问题（此", "1.3拟采取的研究方案及可行性分析", "3", "．拟采取的研究方案及可行性分析（包括研究方法、技术路线、", "", 3, labelAndInfoMap);
                i = Util.getReportText(i, l, labelSet, "1.3拟采取的研究方案及可行性分析", "．拟采取的研究方案及可行性分析（包括研究方法、技术路线、", "1.4本项目的特色与创新之处", "4", "．本项目的特色与创新之处；", "", 3, labelAndInfoMap);
                i = Util.getReportText(i, l, labelSet, "1.4本项目的特色与创新之处", "．本项目的特色与创新之处；", "1.5年度研究计划及预期研究结果", "5", "．年度研究计划及预期研究结果（包括拟组织的重要学术交流活", "", 3, labelAndInfoMap);
                i = Util.getReportText(i, l, labelSet, "1.5年度研究计划及预期研究结果", "．年度研究计划及预期研究结果（包括拟组织的重要学术交流活", "（二）研究基础与工作条件", "（二）研究基础与工作条件", "", "", 3, labelAndInfoMap);
                i = Util.getReportText(i, l, labelSet, "（二）研究基础与工作条件", "（二）研究基础与工作条件", "2.2工作条件", "2", "．工作条件（包括已具备的实验条件，尚缺少的实验条件和拟解", "", 3, labelAndInfoMap);
                i = Util.getReportText(i, l, labelSet, "2.2工作条件", "．工作条件（包括已具备的实验条件，尚缺少的实验条件和拟解", "2.3正在承担的与本项目相关的科研项目情况", "3", "．正在承担的与本项目相关的科研项目情况（申请人和主要参与", "", 4, labelAndInfoMap);
                i = Util.getReportText(i, l, labelSet, "2.3正在承担的与本项目相关的科研项目情况", "．正在承担的与本项目相关的科研项目情况（申请人和主要参与", "2.4完成国家自然科学基金项目情况", "4", "．完成国家自然科学基金项目情况（对申请人负责的前一个已资", "", 6, labelAndInfoMap);
                i = Util.getReportText(i, l, labelSet, "2.4完成国家自然科学基金项目情况", "．完成国家自然科学基金项目情况（对申请人负责的前一个已资", "（三）其他需要说明的情况", "（三）其他需要说明的情况", "", "", 7, labelAndInfoMap);
                i = Util.getReportText(i, l, labelSet, "（三）其他需要说明的情况", "（三）其他需要说明的情况", "3.2具有高级专业技术职务", "2. ", "具有高级专业技术职务（职称）的申请人或者主要参与者是否", "", 7, labelAndInfoMap);
                i = Util.getReportText(i, l, labelSet, "3.2具有高级专业技术职务", "具有高级专业技术职务（职称）的申请人或者主要参与者是否", "3.3单位不一致的情况", "3. ", "具有高级专业技术职务（职称）的申请人或者主要参与者是否", "", 6, labelAndInfoMap);
                i = Util.getReportText(i, l, labelSet, "3.3单位不一致的情况", "类型、项目名称、单位名称、起止年月，并说明单位不一致原因。", "3.4其他", "4. ", "其他。", "", 2, labelAndInfoMap);
                i = Util.getReportText(i, l, labelSet, "3.4其他", "其他。", "简历", "2024版", "", "", 2, labelAndInfoMap);
            } else if (isResume) {
                if ("序号".equals(t) && ((l.size() > (i + 1)) && l.get(i + 1).getText().equals("附件名称")) && ((l.size() > (i + 2)) && l.get(i + 2).getText().equals("备注"))) {
                    isResume = false;
                    isAnnex = true;
//                    i = i - 1;
                }
                i = Util.getResume(i, l, t, resumeList);
            } else if (isAnnex) {
                i = Util.getAnnexField(i, l, 0, annexList);
                if ("国家自然科学基金项目申请人和参与者承诺书".equals(t)) {
                    break;
                }
            }
        }
        List<String> articleList = new ArrayList<>();
        for (Map.Entry<String, String> entry : labelAndInfoMap.entrySet()) {
            String info = entry.getValue();
            String[] split = info.split(System.lineSeparator());
            for (String s : split) {
                if (Pattern.compile("^\\[[0-9]{1,2}] |]\\..*?(19|20)\\d{2}").matcher(s).find()) {
                    if (s.length() > 2 && Pattern.compile(" \\[[0-9]{1,2}] |].").matcher(s.substring(2)).find()) {
                        String[] list = s.replaceAll("( \\[[0-9]{1,2}] | \\[[0-9]{1,2}].)", "ĺļ$1").split("ĺļ");
                        for (String string : list) {
                            articleList.add(string.trim());
                        }
                    } else {
                        articleList.add(s.trim());
                    }
                }
            }
        }
        List<En.BidArticle> bidArticleList = new ArrayList<>();
        for (String s : articleList) {
            En.BidArticle bidArticle = new En.BidArticle();
            bidArticle.setType("相关文献");
            bidArticle.setInfo(s);
            bidArticleList.add(bidArticle);

        }

        biaoshuEntity.setCover(cover);
        biaoshuEntity.setApplicant(applicant);
        biaoshuEntity.setHostInstitution(hostInstitution);
        biaoshuEntity.setProject(project);
        biaoshuEntity.setPrincipalInvestigatorList(principalInvestigatorList);
        biaoshuEntity.setTotal(total);
        biaoshuEntity.setBudgetList(budgetList);
        biaoshuEntity.setArticle_list(bidArticleList);
        biaoshuEntity.setInstructions(labelAndInfoMap.getOrDefault("预算说明书", "").trim());
        biaoshuEntity.setReport_text_1_1(labelAndInfoMap.getOrDefault("（一）立项依据与研究内容", "").trim());
        biaoshuEntity.setReport_text_1_2(labelAndInfoMap.getOrDefault("1.2项目的研究内容", "").trim());
        biaoshuEntity.setReport_text_1_3(labelAndInfoMap.getOrDefault("1.3拟采取的研究方案及可行性分析", "").trim());
        biaoshuEntity.setReport_text_1_4(labelAndInfoMap.getOrDefault("1.4本项目的特色与创新之处", "").trim());
        biaoshuEntity.setReport_text_1_5(labelAndInfoMap.getOrDefault("1.5年度研究计划及预期研究结果", "").trim());
        biaoshuEntity.setReport_text_2_1(labelAndInfoMap.getOrDefault("（二）研究基础与工作条件", "").trim());
        biaoshuEntity.setReport_text_2_2(labelAndInfoMap.getOrDefault("2.2工作条件", "").trim());
        biaoshuEntity.setReport_text_2_3(labelAndInfoMap.getOrDefault("2.3正在承担的与本项目相关的科研项目情况", "").trim());
        biaoshuEntity.setReport_text_2_4(labelAndInfoMap.getOrDefault("2.4完成国家自然科学基金项目情况", "").trim());
        biaoshuEntity.setReport_text_3_1(labelAndInfoMap.getOrDefault("（三）其他需要说明的情况", "").trim());
        biaoshuEntity.setReport_text_3_2(labelAndInfoMap.getOrDefault("3.2具有高级专业技术职务", "").trim());
        biaoshuEntity.setReport_text_3_3(labelAndInfoMap.getOrDefault("3.3单位不一致的情况", "").trim());
        biaoshuEntity.setReport_text_3_4(labelAndInfoMap.getOrDefault("3.4其他", "").trim());
        biaoshuEntity.setReferenceList(referenceList);
        biaoshuEntity.setResumeList(resumeList);
        biaoshuEntity.setAnnexList(annexList);

        try {
            Db.use().insert(Entity.create(fundTable)
                    .set("cover", JSONUtil.toJsonStr(cover))
                    .set("applicant", JSONUtil.toJsonStr(applicant))
                    .set("hostInstitution", JSONUtil.toJsonStr(hostInstitution))
                    .set("project", JSONUtil.toJsonStr(project))
                    .set("principalInvestigatorList", JSONUtil.toJsonStr(principalInvestigatorList))
                    .set("total", JSONUtil.toJsonStr(total))
                    .set("budgetList", JSONUtil.toJsonStr(budgetList))
                    .set("instructions", labelAndInfoMap.getOrDefault("预算说明书", "").trim())
                    .set("report_text_1_1", labelAndInfoMap.getOrDefault("（一）立项依据与研究内容", "").trim())
                    .set("report_text_1_2", labelAndInfoMap.getOrDefault("1.2项目的研究内容", "").trim())
                    .set("report_text_1_3", labelAndInfoMap.getOrDefault("1.3拟采取的研究方案及可行性分析", "").trim())
                    .set("report_text_1_4", labelAndInfoMap.getOrDefault("1.4本项目的特色与创新之处", "").trim())
                    .set("report_text_1_5", labelAndInfoMap.getOrDefault("1.5年度研究计划及预期研究结果", "").trim())
                    .set("report_text_2_1", labelAndInfoMap.getOrDefault("（二）研究基础与工作条件", "").trim())
                    .set("report_text_2_2", labelAndInfoMap.getOrDefault("2.2工作条件", "").trim())
                    .set("report_text_2_3", labelAndInfoMap.getOrDefault("2.3正在承担的与本项目相关的科研项目情况", "").trim())
                    .set("report_text_2_4", labelAndInfoMap.getOrDefault("2.4完成国家自然科学基金项目情况", "").trim())
                    .set("report_text_3_1", labelAndInfoMap.getOrDefault("（三）其他需要说明的情况", "").trim())
                    .set("report_text_3_2", labelAndInfoMap.getOrDefault("3.2具有高级专业技术职务", "").trim())
                    .set("report_text_3_3", labelAndInfoMap.getOrDefault("3.3单位不一致的情况", "").trim())
                    .set("report_text_3_4", labelAndInfoMap.getOrDefault("3.4其他", "").trim())
                    .set("reference_list", JSONUtil.toJsonStr(referenceList))
                    .set("resume_list", JSONUtil.toJsonStr(resumeList))
                    .set("annex_list", JSONUtil.toJsonStr(annexList))
                    .set("article_list", JSONUtil.toJsonStr(articleList))
            );
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }


}
